package main

import (
	"bufio"
	"fmt"
	"os"
)

const tmpFilePath string = "/tmp/data_xiao_bai"
const tmpFilePath2 string = "/tmp/data_xiao_bai2"

func main() {
	// 写入一个字符串到一个文件
	d1 := []byte("hello\ngo\n")
	err := os.WriteFile(tmpFilePath, d1, 0644)
	check(err)

	// 对于更细粒度的写入，先打开一个文件。
	f, err := os.Create(tmpFilePath2)
	check(err)

	// 打开文件后，习惯立即使用 defer 调用文件的 Close操作
	defer func(f *os.File) {
		closeErr := f.Close()
		check(closeErr)

		removeFiles(tmpFilePath, tmpFilePath2)
		fmt.Println("file is closed")
	}(f)

	// 写入的字节切片
	d2 := []byte{115, 111, 109, 101, 10} // “some”的字节切片
	n2, err := f.Write(d2)
	check(err)
	fmt.Printf("wrote %d bytes\n", n2) // wrote 5 bytes

	// WriteString 也是可用的。
	n3, err := f.WriteString("writes\n")
	fmt.Printf("wrote %d bytes\n", n3) // wrote 7 bytes

	// 调用 Sync 来将缓冲区的信息写入磁盘
	err = f.Sync()
	check(err)

	// bufio 提供了带缓冲的写入器
	w := bufio.NewWriter(f)
	n4, err := w.WriteString("buffered\n")
	fmt.Printf("wrote %d bytes\n", n4) // wrote 9 bytes

	// 使用 Flush 来确保所有缓存的操作已写入底层写入器
	err = w.Flush()
	check(err)
}

func check(e error) {
	if e != nil {
		panic(e)
	}
}

func removeFiles(filePaths ...string) {
	for _, f := range filePaths {
		err := os.Remove(f)
		if err != nil {
			fmt.Println("Error removing file error:", f, err)
			continue
		}
	}
}
